// package: rewords-server-2024
// filename: query_in
// author: diogoxiang@gmail.com
// time: 2024/11/5 15:25
// desc: 主要用 后台 查询条件  配合 amis 表单用

package query_in

const (
	OpAnd Op = "and"
	OpOr  Op = "or"

	ConditionTypeEq      ConditionType = "eq"       // 等于
	ConditionTypeNotEq   ConditionType = "not_eq"   // 不等于
	ConditionTypeLike    ConditionType = "like"     // 模糊匹配
	ConditionTypeNotLike ConditionType = "not_like" // 不包含
	ConditionTypeIn      ConditionType = "in"       // in
	ConditionTypeNotIn   ConditionType = "not_in"   // not in
	ConditionTypeGt      ConditionType = "gt"       // 大于
	ConditionTypeLt      ConditionType = "lt"       // 小于
	ConditionTypeGte     ConditionType = "gte"      // 大于等于
	ConditionTypeLte     ConditionType = "lte"      // 小于等于

	ConditionTypeBetween ConditionType = "between" // 区间

	OrderTypeAsc  OrderType = "asc"  // 升序
	OrderTypeDesc OrderType = "desc" // 降序
)

// FieldType 字段类型
const (
	FieldTypeString string = "string"
	FieldTypeInt    string = "int"
	//FieldTypeFloat string = "float"
)

type OrderType string

type ConditionType string

// Op and or连接符
type Op string

// Page 分页参数
type Page struct {
	Offset     int64 `json:"offset"`      // 游标起始位置 如 0 10 20 30
	Limit      int64 `json:"limit"`       // 每页记录数
	HasNext    bool  `json:"has_next"`    // 是否有下一页
	Count      int64 `json:"count"`       // 总记录数
	QueryCount bool  `json:"query_count"` // 是否查询总数
}

// PageResult 分页返回结果
type PageResult struct {
	Current  int64 `json:"current"`   // 当前页码
	PageSize int64 `json:"page_size"` // 每页条数
	Total    int64 `json:"total"`     // 总记录数
	Pages    int64 `json:"pages"`     // 总页数
	HasNext  bool  `json:"has_next"`  // 是否有下一页
}

// ToPageResult 将Page转换为PageResult
func (p *Page) ToPageResult() *PageResult {
	if p == nil {
		return nil
	}

	current := (p.Offset / p.Limit) + 1
	pages := (p.Count + p.Limit - 1) / p.Limit

	return &PageResult{
		Current:  current,
		PageSize: p.Limit,
		Total:    p.Count,
		Pages:    pages,
		HasNext:  p.HasNext,
	}
}

// QueryRecord 查询参数
type QueryRecord struct {
	TableName   string       `json:"table_name"`             // 查询表
	Fields      []string     `json:"fields"`                 // 投影字段
	Conditions  []Condition  `json:"conditions,omitempty"`   // 查找字段
	OrderFields []OrderField `json:"order_fields,omitempty"` // 排序字段
	Page        *Page        `json:"page,omitempty"`         // 分页参数
}

// OrderField 排序字段
type OrderField struct {
	Field     string    `json:"field"`
	OrderType OrderType `json:"order_type"`
}

// Condition 条件语句
type Condition struct {
	Disable       bool          `json:"disable"`        // true 禁用该条件
	Op            Op            `json:"op"`             // and or 连接符
	Field         string        `json:"field"`          // 查询条件字段
	FieldType     string        `json:"field_type"`     // 字段类型
	Vals          []any         `json:"vals"`           // 查询字段值
	ConditionType ConditionType `json:"condition_type"` // 查找类型
}
